package Window;
import javax.media.opengl.GL2;
import Builder.BrickSelectionManager;
import Builder.MainCamera;
import Command.LDrawPart;
import Common.Box3;
import Common.Vector3f;
public class GlobalBoundingBoxRenderer {
private static GlobalBoundingBoxRenderer _instance = null;
public synchronized static GlobalBoundingBoxRenderer getInstance() {
return _instance;
}
public synchronized static GlobalBoundingBoxRenderer getInstance(
MainCamera camera) {
if (_instance == null)
_instance = new GlobalBoundingBoxRenderer(camera);
return _instance;
}
private MainCamera camera;
private LDrawPart pointingPart = null;
private GlobalBoundingBoxRenderer(MainCamera cam) {
camera = cam;
}
public void setPointingPart(LDrawPart part) {
this.pointingPart = part;
}
public void draw(GL2 gl2) {
gl2.glDisable(GL2.GL_LIGHTING);
gl2.glUseProgram(0);
gl2.glMatrixMode(GL2.GL_PROJECTION);
gl2.glPushMatrix();
gl2.glLoadMatrixf(camera.getProjection(), 0);
gl2.glMatrixMode(GL2.GL_MODELVIEW);
gl2.glPushMatrix();
gl2.glLoadMatrixf(camera.getModelView(), 0);
drawBoundingBoxes(gl2);
gl2.glMatrixMode(GL2.GL_MODELVIEW);
gl2.glPopMatrix();
gl2.glMatrixMode(GL2.GL_PROJECTION);
gl2.glPopMatrix();
gl2.glEnable(GL2.GL_LIGHTING);
}
private void drawBoundingBox(GL2 gl2, Vector3f[] pos) {
gl2.glBegin(GL2.GL_LINES); // draw using triangles
gl2.glColor4d(1, 0, 0, 1.0f);
gl2.glVertex3f(pos[0].x, pos[0].y, pos[0].z);
gl2.glVertex3f(pos[1].x, pos[1].y, pos[1].z);
gl2.glVertex3f(pos[1].x, pos[1].y, pos[1].z);
gl2.glVertex3f(pos[2].x, pos[2].y, pos[2].z);
gl2.glVertex3f(pos[2].x, pos[2].y, pos[2].z);
gl2.glVertex3f(pos[3].x, pos[3].y, pos[3].z);
gl2.glVertex3f(pos[3].x, pos[3].y, pos[3].z);
gl2.glVertex3f(pos[0].x, pos[0].y, pos[0].z);
gl2.glVertex3f(pos[4].x, pos[4].y, pos[4].z);
gl2.glVertex3f(pos[5].x, pos[5].y, pos[5].z);
gl2.glVertex3f(pos[5].x, pos[5].y, pos[5].z);
gl2.glVertex3f(pos[6].x, pos[6].y, pos[6].z);
gl2.glVertex3f(pos[6].x, pos[6].y, pos[6].z);
gl2.glVertex3f(pos[7].x, pos[7].y, pos[7].z);
gl2.glVertex3f(pos[7].x, pos[7].y, pos[7].z);
gl2.glVertex3f(pos[4].x, pos[4].y, pos[4].z);
gl2.glVertex3f(pos[0].x, pos[0].y, pos[0].z);
gl2.glVertex3f(pos[4].x, pos[4].y, pos[4].z);
gl2.glVertex3f(pos[1].x, pos[1].y, pos[1].z);
gl2.glVertex3f(pos[5].x, pos[5].y, pos[5].z);
gl2.glVertex3f(pos[2].x, pos[2].y, pos[2].z);
gl2.glVertex3f(pos[6].x, pos[6].y, pos[6].z);
gl2.glVertex3f(pos[3].x, pos[3].y, pos[3].z);
gl2.glVertex3f(pos[7].x, pos[7].y, pos[7].z);
gl2.glEnd();
}
private void drawBoundingBoxes(GL2 gl2) {
gl2.glLineWidth(1.45f);
if (pointingPart != null) {
gl2.glLoadMatrixf(camera.getModelView(), 0);
drawBoundingBox(gl2, pointingPart.getCachedOOB());
}
for (LDrawPart part : BrickSelectionManager.getInstance()
.getSelectedPartList()) {
drawBoundingBox(gl2, part.getCachedOOB());
}
}
}